from typing import List
from common.enum.strategy_group_enum import StrategyGroup
from common.enum.strategy_type_enum import StrategyType
from dto.strategy_info import StrategyInfoMetadata
from dto.strategy_assessment import RiskAssessment
from dto.strategy_info import StrategyInfoMetadata
from dto.strategy_stock_day import StrategyStockDay
from service.strategy.base_strategy import BaseStrategy


class TenDaysUpStrategy(BaseStrategy):
    """
    连续10天内有5天以上上涨，且当前价格比10天前上涨10%以上的策略。
    每上涨一天得分 +1；若当天上涨幅度大于3%，得分再加 +1。
    """

    def analyze(self, trade_info_list: List[StrategyStockDay]) -> RiskAssessment:
        """
        分析过去10天内上涨天数，并判断当前价格与10天前的涨幅。
        """
        node_point = 0
        description = ""

        # 确保至少有10天的交易数据
        if len(trade_info_list) >= 10:
            # 计算过去10天内上涨的天数
            up_days = sum(
                1
                for i in range(10)
                if trade_info_list[i].close > trade_info_list[i].pre_close
            )

            # 如果有5天或以上是上涨的
            if up_days >= 5:
                description += f"股票在过去10天里上涨了{up_days}天. "
                node_point += up_days  # 每上涨一天得分 +1

                # 检查当前价格与10天前的价格涨幅
                if trade_info_list[0].close > trade_info_list[9].close * 1.10:
                    description += f"当前价格比10天前高10%. "
                    node_point += 5  # 额外得分

                # 检查当前当天涨幅是否大于3%
                if trade_info_list[0].pct_chg > 3:
                    description += f"当日价格变动大于3%. "
                    node_point += 1  # 如果涨幅大于3%，得分 +1

        return RiskAssessment(
            stock_code=trade_info_list[0].stock_code,
            description=description,
            config=self.strategyConfig(),
            node_point=node_point,
        )

    def strategyConfig(self) -> dict:
        """
        返回策略的配置
        """
        return StrategyInfoMetadata(
            strategy_code="ten_days_up_strategy",
            strategy_name="10个交易日内有多天是上涨",
            strategy_group=StrategyGroup.ATTENTION,
            strategy_type=StrategyType.PRICE,
            analysis_day=10,
            strategy_level=3,
        )
